package com.wjm.api.SynchronizePackage;

/**
 * Data:2022年07月27日
 * Author:wjm
 * Content: synchronize加在指定的代码上面
 *
 *
 *  案例:
 *      模拟商场购物的场景
 *
 *  格式：
 *       synchronized(同步监视器对象){ //不同线程监听的对象得是同一个
 *             需要多线程同步执行的代码片段
 *       }
 *
 *  作用：
 *      有效的缩小同步范围可以保证在并发的前提下，提高代码的执行效率
 *
 */
public class SynchronizeDemo1 {
    public static void main(String[] args) {
        //创建一个商场对象
        Shop shop = new Shop();

        //创建一个购物线程
        Thread thread1 = new Thread("wjm"){
            @Override
            public void run() {
                shop.buy();
            }
        };

        //创建一个购物线程
        Thread thread2 = new Thread("cwt"){
            @Override
            public void run() {
                shop.buy();
            }
        };

        //启动线程
        thread1.start();
        thread2.start();
    }
}

//创建一个商场类
class Shop{
    public void buy()  {
        try {
            System.out.println(Thread.currentThread().getName()+"正在挑选衣服");
            //模拟线程挑衣服的时间
            Thread.sleep(2000);

            //我们需要将试衣服这段代码加锁（synchronize），如果给整个方法加锁效率太低
            //我们这里要监听的对象应该是试衣间，但是在我们设定这边一个商场就一个试衣间，所以监听商场对象即可
            //这里的this指代的商场对象shop，监听的对象要是同一个，要是在两个不同商场的试衣间就根本不存在两个人取同一个试衣间的问题
            synchronized (this){
                System.out.println(Thread.currentThread().getName()+"正在试衣间试衣服");
                Thread.sleep(2000);
            }

            System.out.println(Thread.currentThread().getName()+"正在结账");
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}